package edu.kufpg.armatus.util; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; import android.content.Context; import android.os.Parcel; import android.os.Parcelable; import android.util.AttributeSet; import android.view.View; import android.widget.ImageButton; public class StickyImageButton extends ImageButton { private OnClickListener mOnClickListener; private boolean mIsStuck = false; private final ReentrantLock mLock = new ReentrantLock(true); private final Condition mLockInEffect = mLock.newCondition(); public StickyImageButton(Context context) { super(context); init(); } public StickyImageButton(Context context, AttributeSet attrs) { super(context, attrs); init(); } public StickyImageButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } private void init() { super.setOnClickListener(new OnClickListener() { @Override public final void onClick(View v) { click(true); } }); } @Override public void setOnClickListener(OnClickListener l) { mOnClickListener = l; } public boolean isStuck() { return mIsStuck; } public void unstick() { mLock.lock(); try { if (mIsStuck) { mLockInEffect.signal(); mIsStuck = false; setEnabled(true); } } finally { mLock.unlock(); } } private void click(boolean callListener) { mLock.lock(); try { while (mIsStuck) { try { mLockInEffect.await(); } catch (InterruptedException e) { e.printStackTrace(); } } mIsStuck = true; setEnabled(false); if (callListener && mOnClickListener != null) { mOnClickListener.onClick(this); } } finally { mLock.unlock(); } } @Override public Parcelable onSaveInstanceState() { Parcelable superState = super.onSaveInstanceState(); SavedState ss = new SavedState(superState); ss.isStuck = isStuck(); return ss; } @Override public void onRestoreInstanceState(Parcelable state) { if (!(state instanceof SavedState)) { super.onRestoreInstanceState(state); } SavedState ss = (SavedState) state; super.onRestoreInstanceState(ss.getSuperState()); if (ss.isStuck) { click(false); } } protected static class SavedState extends BaseSavedState { boolean isStuck; SavedState(Parcelable superState) { super(superState); } @Override public void writeToParcel(Parcel dest, int flags) { super.writeToParcel(dest, flags); dest.writeInt(isStuck ? 1 : 0); } public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() { @Override public SavedState createFromParcel(Parcel in) { return new SavedState(in); } @Override public SavedState[] newArray(int size) { return new SavedState[size]; } }; private SavedState(Parcel in) { super(in); isStuck = (in.readInt() != 0); } } }